/*
var s='有一个单引号\',有一个双引号\",有一个反斜号\\。'
console.log(s);

var str=`多
行
字
符
串
`
//` `反义符 代替\n便捷 换行
console.log(str);


// 模板字符串 替代 + 拼接字符串 用``反引号包起来 ${变量名}
var name='帅哥';
var age=18;

console.log(`我是${name},我现在${age}岁了`)


//ASCII字符可以以\x##形式的十六进制表示
console.log('\x61'+' \x41') //\x61为小写a \x41为大写a

// \u####表示一个Unicode字符

console.log('\u6211\u662f\u5e05\u54e5')

// 字符串下标 
var b ='AbCdEf'
console.log(b[0])       //字符串下标从0开始
//console.log(b[10])    //输出 超出字符串长度的索引不会报错 显示undefined未定义
b[0]='K'    
console.log(b[0])       //重新给字符串下标赋值不会改变它的值       

// for (var i = 0; i < b.length; i++) {
//     console.log(b[i])
// }
 
// 字符串的函数方法
console.log(b.toLowerCase()); // toLowerCase() 全部转为小写
console.log(b.toUpperCase()); // toUpperCase() 转化为大写

console.log(b.indexOf('Ab'))  // 返回字符串内 指定字符串的位置
console.log(b.indexOf('g'))  //  未找到指定字符串会返回-1

console.log(b.substring(2,4)) //截取字符串内指定下标的子串
console.log(b.substring(2))   

*/
//数组

var str=['帅哥',99,function myfunction(){ var name='赵四'},null,true]
console.log(str)   //JavaScript 数组可以为任意类型的元素

console.log(str.length) //获取数组长度

str[4]='美铝'
console.log(str[4])   // 可重新给数组里指定下标的元素重新赋值
//Array可以通过索引把对应的元素修改为新的值，因此，对Array的索引进行赋值会直接修改这个Array

str[8]='不要'        //如果给数组的长度赋值会导致数组长度变化，且不会报错 中间未赋值过的下标会默认为undefined
for (var i =0; i < str.length ;i++) {
    console.log(str[i])
}

// 数组的indexof()
str[7]='99'

console.log(str.indexOf('不要'))
console.log(str.indexOf(99))  //数字99和字符串'99'是不同的元素


//slice() 对应string的substring,截取数组的部分元素，返回一个全新的数组

console.log(str.slice(0,3));  // (3) ['帅哥', 99, ƒ] slice截取部分从起始下标开始到结束下标，但不包括结束下标

strcopy=str.slice()   //如果不向slice传递参数它会截取数组所有元素，利用这一点可以很容易的复制一个数组

//push()向Array数组的末尾添加若干元素   pop()把数组最后一个元素删除

str.push('蓝天','白云')
console.log(str)    //['帅哥', 99, ƒ, null, '美铝', 空属性 × 2, '99', '不要', '蓝天', '白云']

str.pop()
console.log(str)    //['帅哥', 99, ƒ, null, '美铝', 空属性 × 2, '99', '不要', '蓝天'] 空数组继续pop不会报错，而是返回undefined


//unshift和shift 如果要往Array的头部添加若干元素，使用unshift()方法，shift()方法则把Array的第一个元素删掉


str.unshift("我是第一",'我是第二') //unshift() 在数组头部添加若干元素 
console.log(str)

//str.shift()                      //删除数组的第一个元素 空数组继续shift不会报错，而是返回undefined
//console.log(str.shift())
//console.log(str)


//str.reverse()                      //反转数组 重新排序
//console.log(str)        

//splice()方法是修改Array的“万能方法”，它可以从指定的索引开始删除若干元素，然后再从该位置添加若干元素：

str.splice(2,1,'我是第三')           //在指定索引开始删除指定个数的元素，并添加若干元素
console.log(str)

str.splice(2,1)                     //仅执行删除元素不添加
console.log(str)


// concat() 方法把当前的Array和另一个Array连接起来，并返回一个新的Array
// 语法 var arryZ=array1.concat(array2, array3, ..., arrayX) 必需有一个承接的新数组
var arr = ['A', 'B', 'C'];
//var added = arr.concat([1, 2, 3]);   //要用一个新的数组来承接 concat()方法并没有修改当前Array，而是返回了一个新的Array
//console.log(added)


var added =arr.concat("帅哥","美女",["大帅哥",66])
console.log(added)

// join join()方法是一个非常实用的方法，它把当前Array的每个元素都用指定的字符串连接起来，然后返回连接后的字符串：

console.log(str.join(" or "))  //join()内 放指定要以什么字符串相连接 如果Array的元素不是字符串，将自动转换为字符串后再连接


// 多维数组 如果数组的某个元素又是一个Array，则可以形成多维数组
//想取出第二个数组中300的话
var doublearr=[[1,2,3],[100,200,300,],'-v-'];
var x=doublearr[1][2]    //doublerarr[1]相当于取出数组中索引为1的元素[100,200,300,] 该元素也是数组所以若干想要取出该二维的元素则[2]doublerarr[1][2] 
console.log(x)

/*
练习：在新生欢迎会上，你已经拿到了新同学的名单，请排序后显示：欢迎XXX，XXX，XXX和XXX同学！：
```
'use strict';
var arr = ['小明', '小红', '大军', '阿黄'];
console.log('???');
*/

var arr = ['小明', '小红', '大军', '阿黄'];

console.log(`欢迎${arr[0]},${arr[1]},${arr[2]},${arr[3]}同学!`)


var arrsort=[2,1,34,46,67,87]

arrsort.soft1=function()
{
    for(var j=0;j<this.length;j++)
    {
        var item=this[j];
        var idx =0;

        for(var i=j+1;i<this.length;i++)
        {
            if(item>this[i]){
                item=this[i];
                idx=1
            }
        }
        if(this[j]!==item){
            var a=this[j]
            this[j]=this[idx]
            this[idx]=a
        }
        
    }   
    console.log(arrsort);
}

arrsort.soft1();

